package contest.oop.sse.person;

import contest.oop.sse.message.Message;
import contest.oop.sse.message.MessageType;

import java.util.List;

/**
 * 抽象通信者类
 *
 * @author paule
 */
public abstract class Agent {
    protected Message message;
    protected List<Agent> connectors;
    protected String name;

    /**
     * 向所有注册的 Agent 对象发送消息
     *
     * @param message 要发送的消息
     */
    public void send(Message message) {
        for (Agent connector: connectors) {
            connector.receive(message);
        }
    }

    /**
     * 向所有注册的 Agent 对象发送自身保持的消息
     */
    public void send() {
        for (Agent connector: connectors) {
            connector.receive(this.message);
        }
    }

    /**
     * 接收消息并保存到本对象的message字段中
     *
     * @param message 收到的消息
     */
    public abstract void receive(Message message);

    /**
     * 创建消息，消息体内容根据 messageType 参数自动生成
     *
     * @param messageType 消息类型
     */
    public abstract void createMessage(MessageType messageType);

    /**
     * 创建含有消息体的消息
     *
     * @param messageType 消息类型
     * @param msgBody 消息体内容
     */
    public abstract void createMessage(MessageType messageType, String msgBody);

    /**
     * 添加订阅的 Agent 对象
     *
     * @param connector 要添加的Agent对象
     */
    public void addConnector(Agent connector) {
        this.connectors.add(connector);
    }

    /**
     * 移除指定的 Agent 对象
     *
     * @param connector 要移除的Agent对象
     */
    public void removeConnector(Agent connector) {
        this.connectors.remove(connector);
    }

    public String getName() {
        return this.name;
    }
}
